package model

import (
	"time"

	"go.mongodb.org/mongo-driver/bson/primitive"
)

type OnlyIDObj struct {
	ID primitive.ObjectID `bson:"_id,omitempty"` // 自动生成 id ,不确定 Revid 的 id 是否是 唯一 id, insert 数据库生成，查询时返回
}

// 表:pages_articles  page article 存储
type PagesArticlesObj struct {
	ID         int64  `bson:"_id"`                // article id , wikipeida 中的 article id
	Version    int64  `bson:"version"`            // 文件导出的日期
	Ns         int32  `bson:"ns"`                 // namespace
	Redirect   string `bson:"redirect,omitempty"` // redirect
	Title      string `bson:"title"`              // title
	RevisionID int64  `bson:"revisionID"`         // revisionID
}

// 表:revision_info
type RevisionInfoObj struct {
	ID         primitive.ObjectID `bson:"_id,omitempty"`        // 自动生成 id ,不确定 Revid 的 id 是否是 唯一 id, insert 数据库生成，查询时返回
	Revid      int64              `bson:"revid"`                // revisionID , wikipeida revision 中的 id
	ArticleID  int64              `bson:"articleID"`            // article id , wikipeida 中的 article id
	Comment    string             `bson:"comment"`              // comment
	ParentID   int64              `bson:"parentID"`             // ParentID
	User       string             `bson:"user"`                 // User
	Timestamp  time.Time          `bson:"timestamp"`            // timestamp
	TextHidden bool               `bson:"texthidden,omitempty"` // text 是否已经被删除， true 代表已删除
}

// 表:revision_detail
type RevisionDetailObj struct {
	ID         primitive.ObjectID `bson:"_id"`                  // 同 revision_info 的 id
	Revid      int64              `bson:"revid"`                // revisionID , wikipeida revision 中的 id
	ArticleID  int64              `bson:"articleID"`            // article id , wikipeida 中的 article id
	Timestamp  time.Time          `bson:"timestamp"`            // timestamp
	Text       string             `bson:"text"`                 // 详细内容
	TextHidden bool               `bson:"texthidden,omitempty"` // text 是否已经被删除， true 代表已删除
}

// 表:schedule_revision_info
type ScheduleOfRevisionInfoObj struct {
	ID                  int64     `bson:"_id"`                           // article id
	Title               string    `bson:"-"`                             // 数据库中不保存，仅在任务中使用
	FailCount           int32     `bson:"failCount"`                     // failCount 获取 revision 失败次数
	Message             string    `bson:"message,omitempty"`             // 更新失败的信息
	Update              time.Time `bson:"update"`                        // 最后更新时间
	LastRevisionID      int64     `bson:"lastRevisionID,omitempty"`      // 最后出现的 revision id
	LastRevisionUpdate  time.Time `bson:"lastRevisionUpdate,omitempty"`  // 最后出现的 revision update 时间
	FirstRevisionID     int64     `bson:"firstRevisionID,omitempty"`     // 最早出现的 revision id
	FirstRevisionUpdate time.Time `bson:"firstRevisionUpdate,omitempty"` // 最早出现的 revision update 时间
}

// snap 镜像表 snapshot_article_revision
type SnapshotOfArticleRevisionObj struct {
	ID              int64                         `bson:"_id"`                       // article id
	Title           string                        `bson:"-"`                         // 数据库中不保存，仅在任务中使用
	Snapshot        map[string]primitive.ObjectID `bson:"snapshot"`                  // snapshot 当时的镜像 revision ID , key  2020-03-31
	Update          time.Time                     `bson:"update"`                    // 最后更新时间
	Birthday        time.Time                     `bson:"birthday"`                  // 最早的文章时间
	LastSnapshot    string                        `bson:"lastSnapshot"`              // 最后更新的 snapshot key
	MissSnapshot    bool                          `bson:"missSnapshot,omitempty"`    // 存在 snapshot texthidden 的标记
	FixMissSnapshot bool                          `bson:"fixMissSnapshot,omitempty"` // fix snapshot texthidden 的标记
}

//  表: schedule_revision_detail 下载的标记，下载完成 Finsh 标记 true
type ScheduleOfRevisionDetailObj struct {
	ID         primitive.ObjectID `bson:"_id,omitempty"`        // 同 revision_info 的 id
	Title      string             `bson:"-"`                    // 数据库中不保存，仅在任务中使用
	FailCount  int32              `bson:"failCount"`            // failCount 获取 revision 失败次数
	Message    string             `bson:"message,omitempty"`    // 更新失败的信息
	Revid      int64              `bson:"revid"`                // revisionID , wikipeida revision 中的 id
	ArticleID  int64              `bson:"articleID"`            // article id , wikipeida 中的 article id
	Update     time.Time          `bson:"update"`               // 最后更新时间
	Finish     bool               `bson:"finish"`               // 是否已经下载下来
	TextHidden bool               `bson:"texthidden,omitempty"` // text 是否已经被删除， true 代表已删除
}

// ---------------------------------------------------------- load 数据集合

// 表 user
type LoadRevisionWords struct {
	Revid     int64     `bson:"revid"`     // revisionID , wikipeida revision 中的 id
	ArticleID int64     `bson:"articleID"` // article id , wikipeida 中的 article id
	Timestamp time.Time `bson:"timestamp"` // timestamp
	Ns        int32     `bson:"ns"`        // namespace
	Words     int32     `bson:"words"`     //字符数
}

// 表 user
type LoadUserObj struct {
	ID       primitive.ObjectID `bson:"_id,omitempty"`
	UserID   int64              `bson:"userID"`
	Username string             `bson:"username"`
	Ip       string             `bson:"ip"`
}

// 表:pages_articles  page article 存储
type LoadPagesArticlesObj struct {
	ID                  int64     `bson:"_id"`                           // article id , wikipeida 中的 article id
	Ns                  int32     `bson:"ns"`                            // namespace
	Redirect            string    `bson:"redirect,omitempty"`            // redirect
	Title               string    `bson:"title"`                         // title
	LastRevisionID      int64     `bson:"lastRevisionID,omitempty"`      // 最后出现的 revision id
	LastRevisionUpdate  time.Time `bson:"lastRevisionUpdate,omitempty"`  // 最后出现的 revision update 时间
	FirstRevisionID     int64     `bson:"firstRevisionID,omitempty"`     // 最早出现的 revision id
	FirstRevisionUpdate time.Time `bson:"firstRevisionUpdate,omitempty"` // 最早出现的 revision update 时间
}

// 表:revision_info
type LoadRevisionInfoObj struct {
	// ID         primitive.ObjectID `bson:"_id,omitempty"`        // 自动生成 id ,不确定 Revid 的 id 是否是 唯一 id, insert 数据库生成，查询时返回
	Revid      int64              `bson:"revid"`                // revisionID , wikipeida revision 中的 id
	ArticleID  int64              `bson:"articleID"`            // article id , wikipeida 中的 article id
	Comment    string             `bson:"comment"`              // comment
	ParentID   int64              `bson:"parentID,omitempty"`   // ParentID
	User       primitive.ObjectID `bson:"user,omitempty"`       // User
	Timestamp  time.Time          `bson:"timestamp"`            // timestamp
	Bytes      int32              `bson:"bytes"`                // 详细内容
	TextHidden bool               `bson:"texthidden,omitempty"` // text 是否已经被删除， true 代表已删除
}

// 表:revision_detail, 不存储不需要的 item, 没有 text 的也不存储
type LoadRevisionDetailObj struct {
	// ID        primitive.ObjectID `bson:"_id"`                // 同 revision_info 的 id（非逻辑自洽），用 revid + articleID 一一对应
	Revid     int64     `bson:"revid"`              // revisionID , wikipeida revision 中的 id
	ArticleID int64     `bson:"articleID"`          // article id , wikipeida 中的 article id
	Timestamp time.Time `bson:"timestamp"`          // timestamp
	Text      string    `bson:"-"`                  // 详细内容
	Snapshot  []string  `bson:"snapshot,omitempty"` // 属于的镜像单位 使用 addSet 方法更新
	Format    string    `bson:"format,omitempty"`
}

type RefMatch struct {
	MagID int64 `bson:"magID,omitempty"`
	Mode  int32 `bson:"mode"`
}

type WikipediaRefObj struct {
	ID    string            `bson:"_id"`
	ArtID int64             `bson:"artID"`
	RevID int64             `bson:"revID"`
	Ns    int32             `json:"ns,string" bson:"ns"`
	Ref   map[string]string `bson:"ref"`
	Match RefMatch          `bson:"match,omitempty"`
}

type WikipediaHistoryRefObj struct {
	ID          string            `bson:"_id"`
	ArtIDSnap   []int64           `bson:"artIDSnap"`
	ArtDateSnap interface{}       `bson:"artDateSnap"`
	DateSnap    []int32           `bson:"dateSnap"`
	Ref         map[string]string `bson:"ref"`
	Match       RefMatch          `bson:"match,omitempty"`
}

type WikipediaFileHistoryRefObj struct {
	Hash        string            `bson:"hash"`
	ArtIDSnap   []int64           `bson:"artIDSnap"`
	ArtDateSnap interface{}       `bson:"artDateSnap"`
	DateSnap    []int32           `bson:"dateSnap"`
	Ref         map[string]string `bson:"ref"`
	Match       RefMatch          `bson:"match,omitempty"`
}

type WikipediaHistoryHandingRefObj struct {
	ID          string            `bson:"_id"`
	ArtIDSnap   []int64           `bson:"artIDSnap"`
	ArtDateSnap interface{}       `bson:"artDateSnap"`
	DateSnap    []int32           `bson:"dateSnap"`
	Ref         map[string]string `bson:"ref"`
	Match       RefMatch          `bson:"match,omitempty"`
}
